<?php

namespace Application\Controller\Plugin;

use Zend\Mvc\Controller\Plugin\AbstractPlugin;

class Crawler extends AbstractPlugin {

    const API_GET_URLs = 'http://27.118.18.200:8876/downloadUrl';
    const API_GET_REGION_LINKS = 'http://27.118.18.200:8876/getLinkTemp';
    const API_GET_REGION_CONTENT = 'http://27.118.18.200:8876/getGCContentNeedTemp';

    public function getLinkTemp($url = '', $template = '', $spec = '') {
        $ch = curl_init(self::API_GET_REGION_LINKS . '?url=' . urlencode($url) . '&template=' . urlencode($template) . '&spec=' . $spec);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $result = curl_exec($ch);
        curl_close($ch);
        if (!$result)
            throw new \Exception('CURL không thể kết nối tới địa chỉ : ' . parse_url(self::API_GET_REGION_LINKS, PHP_URL_HOST));

        $data = json_decode($result);
        if (!$data)
            throw new \Exception('Bọ crawler không trả lại dữ liệu');
        return $data;
    }

    public function getContentTemp($url = '', $temps = array()) {
        $ch = curl_init(self::API_GET_URLs . '?url=' . urlencode($url));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $html = curl_exec($ch) or die(curl_error($ch));

        curl_setopt($ch, CURLOPT_URL, self::API_GET_REGION_CONTENT);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_HEADER, 0);

        if (empty($temps))
            throw new \Exception('Không tìm thấy các region cho bài viết mẫu');

        $data = array();
        $wapper = json_decode($html);
        foreach ($temps as $key => $tmp) {
            $ptt = str_replace('$ptt$', '(.*)', $tmp, $flag);
            if ($flag)
                $data[$key][] = $this->filterByRegEx($wapper, $ptt);
            else
                $data[$key][] = $this->filterByAttr($wapper, $ptt);
        }
        curl_close($ch);
        return $data;
    }

    public function filterByRegEx($html = '', $ptt = '') {
        mb_regex_encoding('UTF-8');
        if (!$html)
            throw new \Exception('Region HTML dùng so khớp rỗng');
        $ptt = preg_replace('/>\s+</', '><', trim($ptt));
        if (!$ptt)
            throw new \Exception('Biểu thức RegEX không hợp lệ');
        mb_ereg($ptt, $html, $regs);
        if (!$regs || !is_array($regs))
            throw new \Exception('Không có kết quả với patterm :' . htmlentities($ptt));
        return htmlentities($ptt);
    }

    public function filterByAttr($html = '', $template = '') {
        $ch = curl_init(self::API_GET_REGION_CONTENT);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, array(
            'html' => $html,
            'template' => $template,
        ));

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $result = curl_exec($ch);
        curl_close($ch);
        if (!$result)
            throw new \Exception('CURL không thể kết nối tới địa chỉ : ' . parse_url(self::API_GET_REGION_LINKS, PHP_URL_HOST));
        $data = json_decode($result);

        if (!is_object($data))
            throw new \Exception('Bọ crawler không trả lại dữ liệu');
        if (!$data->err)
            return array(
                'content' => $data->cnt,
                'prtt' => $data->prtt,
            );
        return;
    }

}